CREATE DATABASE demodatabase;
USE demodatabase;
SHOW TABLES;
CREATE TABLE demotable (
Id INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100) NOT NULL,
Email VARCHAR(100) UNIQUE NOT NULL,
Phone CHAR(10) NOT NULL
);
DESC demotable;
โญ PRIMARY KEY = NOT NULL + UNIQUE ยท only one per table.
FOREIGN KEY links tables (many allowed).
Normalization reduces redundancy & improves integrity
- ๐น 1:1 โ person โ pan card
- ๐น 1:N โ school โ student
- ๐น N:N โ customers โ products (junction table)
CREATE TABLE department (
Id INT PRIMARY KEY, Name VARCHAR(100) NOT NULL );
CREATE TABLE employee(
Id INT PRIMARY KEY, Name VARCHAR(100), Salary INT, Department_id INT,
CONSTRAINT emp_depart FOREIGN KEY (Department_id) REFERENCES department(Id) );
๐ PK unique id๐ foreign key reference
CREATE TABLE students (
student_id INT PRIMARY KEY, name VARCHAR(50), age INT, gender VARCHAR(10),
course VARCHAR(50), city VARCHAR(50), marks INT, admission_year INT );
INSERT INTO students VALUES
(101,'Amit Sharma',21,'Male','Java','Mumbai',78,2023),
(102,'Priya Mehta',20,'Female','Python','Pune',85,2024),
(103,'Rahul Patil',22,'Male','Java','Mumbai',65,2022),
(104,'Sneha Joshi',21,'Female','Data Science','Delhi',92,2023);
SELECT * FROM students LIMIT 5;
๐ More rows: 15 total entries (Mumbai, Pune, Delhi etc) โ check full dataset in footer.
ALTER TABLE student ADD COLUMN address VARCHAR(250) NOT NULL;
ALTER TABLE student DROP COLUMN address;
ALTER TABLE student ADD COLUMN Marks INT AFTER Email;
ALTER TABLE student ADD COLUMN Course_Id INT FIRST;
ALTER TABLE student RENAME COLUMN DOB TO Date_of_Birth;
ALTER TABLE student MODIFY COLUMN Age VARCHAR(100);
ALTER TABLE student ADD CONSTRAINT unique_email UNIQUE(Email);
CREATE TABLE check_constraints (
Id INT PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100) NOT NULL, Phone CHAR(10) UNIQUE,
Email VARCHAR(50) UNIQUE NOT NULL, Age INT CHECK (Age > 18),
join_date DATE DEFAULT (CURRENT_DATE) );
ALTER TABLE customers ADD PRIMARY KEY(Id);
ALTER TABLE customers DROP PRIMARY KEY;
ALTER TABLE customers ADD CONSTRAINT chk_id CHECK (Id > 999);
ALTER TABLE customers DROP CONSTRAINT chk_id;
โ
CHECK๐ DEFAULT๐ UNIQUE๐ AUTO_INCREMENT
SELECT * FROM students ORDER BY marks DESC;
SELECT * FROM students WHERE city = 'Mumbai' ORDER BY admission_year;
SELECT course, AVG(marks) as avg_marks FROM students GROUP BY course;
SELECT city, COUNT(*) as total FROM students
GROUP BY city HAVING COUNT(*) > 2;
๐ก HAVING works on grouped data, WHERE on raw rows.
SELECT * FROM students WHERE name LIKE "A%";
SELECT * FROM students WHERE name LIKE "%a";
SELECT * FROM students WHERE name LIKE "_a%";
SELECT * FROM students WHERE course_id IN (102,105,108);
SELECT * FROM students WHERE age BETWEEN 20 AND 22;
SELECT * FROM students LIMIT 5;
SELECT * FROM students LIMIT 1,3;
SELECT UPPER('mysql'), LOWER('LEARN');
SELECT name, LOWER(name) as lower_name FROM students;
SELECT CONCAT(name, ' - ', course) FROM students;
SELECT SUBSTRING('DATABASE', 1, 4);
SELECT name, LENGTH(name) FROM students WHERE LENGTH(name) > 10;
SELECT AVG(marks), SUM(marks), COUNT(*) FROM students;
๐ Aggregate: MIN, MAX, SUM, AVG, COUNT work great with GROUP BY
CREATE INDEX idx_students_city ON students(city, marks);
ALTER TABLE students DROP INDEX idx_students_city;
CREATE VIEW high_scorers AS SELECT name, course, marks FROM students WHERE marks > 85;
SELECT * FROM high_scorers;
DROP VIEW high_scorers;
๐ Views are virtual tables โ secure & reusable.
DELIMITER //
CREATE PROCEDURE get_mumbai_students()
BEGIN
SELECT name, course, marks FROM students WHERE city = 'Mumbai' ORDER BY marks DESC;
END //
DELIMITER ;
CALL get_mumbai_students();
DROP PROCEDURE get_mumbai_students;
CREATE PROCEDURE filter_by_course(IN course_name VARCHAR(50))
BEGIN SELECT * FROM students WHERE course = course_name; END //
CALL filter_by_course('Java');
CREATE DATABASE company;
USE company;
CREATE TABLE department (Id INT PRIMARY KEY, Name VARCHAR(100) NOT NULL);
CREATE TABLE employee (
Id INT PRIMARY KEY, Name VARCHAR(100), Salary INT, Department_id INT,
CONSTRAINT fk_dept FOREIGN KEY (Department_id) REFERENCES department(Id)
);
INSERT INTO department VALUES (1,'I.T'),(2,'H.R'),(3,'OPERATION');
INSERT INTO employee VALUES (101,'A',23000,1),(102,'B',45000,2),(103,'C',15000,3);
SELECT e.Name, d.Name FROM employee e JOIN department d ON e.Department_id = d.Id;
| Concept | Purpose |
| PRIMARY KEY | UNIQUE + NOT NULL, only one |
| FOREIGN KEY | References PK of another table |
| UNIQUE | No duplicate values |
| CHECK | Condition on values |
| DEFAULT | Fallback value if not provided |
| AUTO_INCREMENT | Auto-increment integer |
| GROUP BY | Groups rows for aggregation |
| HAVING | Filters after GROUP BY |
โจ Many-to-many: bridge table with two foreign keys. Normalization avoids redundancy.
INSERT INTO students VALUES
(105,'Rohan Deshmukh',23,'Male','Python','Nagpur',70,2022),
(106,'Anjali Verma',20,'Female','Java','Pune',88,2024),
(107,'Karan Singh',24,'Male','Data Science','Delhi',60,2021),
(108,'Pooja Nair',22,'Female','Java','Mumbai',95,2023),
(109,'Vikas Gupta',21,'Male','Python','Bangalore',72,2024),
(110,'Neha Kulkarni',23,'Female','Java','Pune',81,2022);
SELECT city, COUNT(*) FROM students GROUP BY city HAVING COUNT(*) >= 2;
SELECT * FROM students WHERE marks BETWEEN 80 AND 95 AND city IN ('Mumbai','Pune');
SELECT name, marks,
CASE WHEN marks >= 85 THEN 'Distinction' ELSE 'Average' END AS grade
FROM students LIMIT 8;
SELECT UPPER(course), LENGTH(name), CONCAT(name, ' (', city, ')') FROM students;
๐ง MySQL complete: DDL ยท ALTER ยท CONSTRAINTS ยท JOINS ยท INDEXES ยท VIEWS ยท PROCEDURES ยท NORMALIZATION (1:1,1:N,N:N) ยท AGGREGATIONS